package com.juntuo.service.helper;

import java.util.Collection;
import java.util.List;

/**
 * 简介：
 * 作者：Jason (chenxj@hadlinks.com)
 * 时间：2018/3/21 15:57
 */
public interface CommonService<T> {
    /**
     *
     * <p class="detail">
     * 功能：查询返回单条记录
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param record
     * @return
     */
    public T selectOne(T record);

    /**
     *
     * <p class="detail">
     * 功能：根据主键进行查询,必须保证结果唯一,单个字段做主键时,可以直接写主键的值,联合主键时,key可以是实体类,也可以是Map
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param obj
     * @return
     */
    public T selectByPrimaryKey(Object obj);

    /**
     *
     * <p class="detail">
     * 功能：根据实体类不为null的字段进行查询,条件全部使用=号and条件
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param record 实体
     * @return
     */
    public List<T> select(T record);

    /**
     *
     * <p class="detail">
     * 功能：根据实体类不为null的字段查询总数,条件全部使用=号and条件
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param record 实体
     * @return
     */
    public int selectCount(T record);

//    /**
//     *
//     * <p class="detail">
//     * 功能：根据主键集合或者数组查询,支持联合主键
//     * </p>
//     * @author <a href="mailto:wangs@financegt.com">Kings</a>
//     * @date 2016年3月21日
//     * @param ids 主键集合或者数组
//     * @return
//     */
//    public List<T> selectByPrimaryKeys(Object ids);

    /**
     *
     * <p class="detail">
     * 功能：根据Example条件进行查询
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param example
     * @return
     */
    public List<T> selectByExample(Object example);

    /**
     *
     * <p class="detail">
     * 功能：插入一条数据
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param record
     * @return
     */
    public int insert(T record) ;

    /**
     *
     * <p class="detail">
     * 功能：插入一条数据,只插入不为null的字段,不会影响有默认值的字段
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param record
     * @return
     */
    public int insertSelective(T record) ;

    /**
     *
     * <p class="detail">
     * 功能：根据实体类中字段不为null的条件进行删除,条件全部使用=号and条件
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param record
     * @return
     */
    public int delete(T record) ;

    /**
     *
     * <p class="detail">
     * 功能：通过主键进行删除,这里最多只会删除一条数据,单个字段做主键时,可以直接写主键的值,联合主键时,key可以是实体类,也可以是Map
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param key
     * @return
     */
    public int deleteByPrimaryKey(Object key) ;

//    /**
//     *
//     * <p class="detail">
//     * 功能：删除实体
//     * </p>
//     * @author <a href="mailto:wangs@financegt.com">Kings</a>
//     * @date 2015年9月27日
//     * @param record
//     * @return
//     */
//    public int deleteAll(Collection<T> record) ;

//    /**
//     *
//     * <p class="detail">
//     * 功能：根据id批量删除,支持联合主键
//     * </p>
//     * @author <a href="mailto:wangs@financegt.com">Kings</a>
//     * @date 2015年9月27日
//     * @param ids
//     * @return
//     */
//    public int deleteByPrimaryKeys(Object ids) ;

    /**
     *
     * <p class="detail">
     * 功能：根据主键进行更新,这里最多只会更新一条数据
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param record
     * @return
     */
    public int updateByPrimaryKey(T record) ;

    /**
     *
     * <p class="detail">
     * 功能：根据主键进行更新,只会更新不是null的数据
     * </p>
     * @author <a href="mailto:wangs@financegt.com">Kings</a>
     * @date 2015年8月4日
     * @param record
     * @return
     */
    public int updateByPrimaryKeySelective(T record) ;


    public List<T> selectAll() ;


}
